﻿/*
* 需求提出：
*   实际开发产品通常需要一个美观的界面。边框阴影效果是最常见的效果。
*   做出来一套代码用于实现这种效果很有必要。网络上的资料基本上比较混乱。
*   于是将此作为一个专题，实现之，加速开发。
*
* 特点：
* 1. 具有边框阴影。
*
* 用途：
* 1、一般用于构建应用程序主界面。
* 2、如要拖动且边框可resize，请使用DragableShadowWidget
*
* 使用技巧：
* 1、如果想获得 DragableShadowDialog、DragableShadowFrame、DragableShadowMainWindow等，
*   只需要分别改变此类的基类为QDialog、QFrame、QMainWindow等即可。
* 2、此控件背景透明，内部需要添加你自己的控件才能看到内容。而且内部的一级子控件需要设置背景色。
*/

#ifndef SHADOW_FRAME_H
#define SHADOW_FRAME_H

#include <QFrame>
#include <QColor>
#include <QVBoxLayout>
#include <QDialog>
#include <QGraphicsDropShadowEffect>


#define __BASE_WIDGET_CLASS__ QWidget // 此处的基类可以改成你需要的QWidget子类，即可获得不同特性的类。

class ShadowWidget : public __BASE_WIDGET_CLASS__
{
    Q_OBJECT

public:
    explicit ShadowWidget(QWidget *parent = 0);
    ~ShadowWidget();

    // 两种效果通用.
    void setShadowWidth(int width);
    inline int shadowWidth();
    void setShadowColor(QColor &color);

    // 仅用于边缘模糊
    void setShadowOffset(qreal dx, qreal dy);
    inline QVBoxLayout *getRootLayout();

public slots:
    void showMaximized();
    void showNormal();

private:

    int m_shadow_width; // 边框宽度
    QColor m_border_color; // 边框颜色.

    QGraphicsDropShadowEffect m_shadow_effect;
    QVBoxLayout m_layout_root;
};

int ShadowWidget::shadowWidth()
{
    return m_shadow_width;
}

QVBoxLayout* ShadowWidget::getRootLayout()
{
    return &m_layout_root;
}



#endif // SHADOW_FRAME_H

